import pandas as pd
import numpy as np
import igraph as ig
import collections
import matplotlib
%matplotlib inline
df_unweighted = pd.read_csv('combined_final_unweighted.csv')
df_unweighted
| node_start | node_end | status | |
|---|---|---|---|
| 0 | Hong Kong | Samoa | jurisdiction |
| 1 | Hong Kong | Samoa | jurisdiction |
| 2 | Hong Kong | Samoa | jurisdiction |
| 3 | Hong Kong | Samoa | jurisdiction |
| 4 | Hong Kong | Samoa | jurisdiction |
| ... | ... | ... | ... |
| 338127 | Indonesia | British Virgin Islands | officer_base |
| 338128 | Cook Islands | British Virgin Islands | officer_base |
| 338129 | Hong Kong | British Virgin Islands | officer_base |
| 338130 | Cook Islands | United Kingdom | officer_base |
| 338131 | Hong Kong | United Kingdom | officer_base |
338132 rows × 3 columns
df_weighted = pd.read_csv('combined_final_weighted.csv')
df_weighted
| node_start | node_end | status | weight | |
|---|---|---|---|---|
| 0 | Hong Kong | Samoa | jurisdiction | 2.0 |
| 1 | Hong Kong | Samoa | jurisdiction | 2.0 |
| 2 | Hong Kong | Samoa | jurisdiction | 2.0 |
| 3 | Hong Kong | Samoa | jurisdiction | 2.0 |
| 4 | Hong Kong | Samoa | jurisdiction | 2.0 |
| ... | ... | ... | ... | ... |
| 338119 | Indonesia | British Virgin Islands | officer_base | 1.0 |
| 338120 | Cook Islands | British Virgin Islands | officer_base | 1.0 |
| 338121 | Hong Kong | British Virgin Islands | officer_base | 1.0 |
| 338122 | Cook Islands | United Kingdom | officer_base | 1.0 |
| 338123 | Hong Kong | United Kingdom | officer_base | 1.0 |
338124 rows × 4 columns
df_weighted['status'].unique()
array(['jurisdiction', 'intermediary_base', 'intermediary_jurisdiction',
'officer_base', 'officer_jurisdiction'], dtype=object)
df_weighted_grouped = pd.read_csv('combined_final_weighted_groupedby.csv')
df_weighted_grouped
| node_start | node_end | weight | |
|---|---|---|---|
| 0 | Albania | Bahamas | 4.0 |
| 1 | Algeria | British Virgin Islands | 2.0 |
| 2 | Algeria | United Kingdom | 2.0 |
| 3 | Algeria | United States | 1.0 |
| 4 | Andorra | Bahamas | 52.0 |
| ... | ... | ... | ... |
| 2835 | Zimbabwe | Hong Kong | 3.0 |
| 2836 | Zimbabwe | Jersey | 1.0 |
| 2837 | Zimbabwe | Panama | 6.0 |
| 2838 | Zimbabwe | Russia | 2.0 |
| 2839 | Zimbabwe | United States | 1.0 |
2840 rows × 3 columns
df_weighted_grouped.describe()
| weight | |
|---|---|
| count | 2840.000000 |
| mean | 194.889613 |
| std | 1729.454201 |
| min | 0.500000 |
| 25% | 2.000000 |
| 50% | 5.000000 |
| 75% | 24.000000 |
| max | 65366.500000 |
# df_jur_grouped_list = df_jur_grouped.values.tolist()
# df_jur_grouped_list
# d = collections.defaultdict(int)
# for n1, n2, v in df_jur_grouped_list:
# d[min(n1, n2), max(n1, n2)] += v
# result = [[k[0], k[1], v] for k, v in d.items()]
# df_net = pd.DataFrame(result)
# df_net
# df_net = df_net.rename(columns = {0:'node_1', 1:'node_2', 2: 'weight'})
# df_net
#df_net.to_csv('undirected_weighted_grouped.csv', index = False)
# df_net.describe()
g = ig.Graph.TupleList(df_weighted_grouped.itertuples(index=False), directed=True, edge_attrs={'weight': "weight"})
ig.plot(g)
g.diameter()
4
print( "Clustering Coefficient: ", g.transitivity_undirected())
Clustering Coefficient: 0.3859593515919117
np.mean(g.degree())
28.979591836734695
np.mean(g.strength(weights = 'weight'))
5647.821428571428
def get_diameter(community):
diameters = []
for i in range(len(community.subgraphs())):
diameters.append(community.subgraphs()[i].diameter())
return (diameters)
def get_transitivity(community):
transitivity = []
for i in range(len(community.subgraphs())):
transitivity.append(community.subgraphs()[i].transitivity_undirected())
return (transitivity)
def get_avg_degree(community):
degree = []
for i in range(len(community.subgraphs())):
degree.append(np.mean(community.subgraphs()[i].degree()))
return degree
def get_avg_weighted_degree(community):
weighted_degree = []
for i in range(len(community.subgraphs())):
weighted_degree.append(np.mean(community.subgraphs()[i].strength(weights = 'weight')))
return weighted_degree
# Define colors used for visualization
colors = ['blue', 'yellow', 'green','purple', 'pink', 'orange', 'lightcoral', 'plum', 'darkgreen', 'darkblue', 'rosybrown',
'crimson', 'steelblue', 'khaki', 'moccasin', 'orangered', 'fuchsia', 'thistle', 'salmon', 'chocolate', 'lightseagreen',
'springgreen', 'darkseagreen', 'deeppink', 'mediumvioletred','olive']
comm_lp= g.community_label_propagation(weights = 'weight')
ig.plot(comm_lp, mark_groups = True, layout="drl")
modularity = g.modularity(comm_lp, weights='weight')
print(modularity)
0.0012260925737978567
#get metrics for each community
print('average weighted degree: ', get_avg_weighted_degree(comm_lp))
print('average degree: ', get_avg_degree(comm_lp))
print('transitivity: ', get_transitivity(comm_lp))
print('diameter: ', get_diameter(comm_lp))
average weighted degree: [0.0, 13304.311688311689, 0.0, 0.0, 84.0, 0.0, 0.0, 165.33333333333334, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] average degree: [0.0, 46.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.3333333333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] transitivity: [nan, 0.6657988605818809, nan, nan, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] diameter: [0, 4, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
comm_leading_eigenvector= g.community_leading_eigenvector(weights = 'weight')
ig.plot(comm_leading_eigenvector, mark_groups = True, layout="drl")
/Users/susankoruthu/opt/anaconda3/lib/python3.8/site-packages/igraph/__init__.py:1281: RuntimeWarning: This method was developed for undirected graphs at src/community/leading_eigenvector.c:530 membership, _, q = GraphBase.community_leading_eigenvector(
modularity = g.modularity(comm_leading_eigenvector, weights='weight')
print(modularity)
0.1503749727369289
#get metrics for each community
print('average weighted degree: ', get_avg_weighted_degree(comm_leading_eigenvector))
print('average degree: ', get_avg_degree(comm_leading_eigenvector))
print('transitivity: ', get_transitivity(comm_leading_eigenvector))
print('diameter: ', get_diameter(comm_leading_eigenvector))
average weighted degree: [3447.0862068965516, 4977.735042735043, 0.85, 0.0] average degree: [8.172413793103448, 24.666666666666668, 0.2, 0.0] transitivity: [0.2783573806881243, 0.45566413318856314, nan, nan] diameter: [3, 3, 1, 0]
df_leading_eigenvector = pd.DataFrame({'name': list(g.vs['name']), 'community':comm_leading_eigenvector.membership } )
df_leading_eigenvector
| name | community | |
|---|---|---|
| 0 | Albania | 0 |
| 1 | Bahamas | 0 |
| 2 | Algeria | 1 |
| 3 | British Virgin Islands | 1 |
| 4 | United Kingdom | 1 |
| ... | ... | ... |
| 191 | Venezuela | 0 |
| 192 | Vietnam | 1 |
| 193 | Yemen | 0 |
| 194 | Zambia | 1 |
| 195 | Zimbabwe | 1 |
196 rows × 2 columns
df_leading_eigenvector.describe()
| community | |
|---|---|
| count | 196.000000 |
| mean | 0.816327 |
| std | 0.621775 |
| min | 0.000000 |
| 25% | 0.000000 |
| 50% | 1.000000 |
| 75% | 1.000000 |
| max | 3.000000 |
##plot community
visual_style = {}
vertex_colors = []
for i in range(len(comm_leading_eigenvector.membership)):
vertex_colors.append(colors[comm_leading_eigenvector.membership[i]])
# Set bbox and margin
visual_style["bbox"] = (5000,5000)
visual_style["margin"] = 17
# Set vertex colours
visual_style["vertex_color"] = vertex_colors
# Set edge width
visual_style["edge_width"] = np.log(g.es['weight']) + 1
# Set edge color
visual_style["edge_color"] = "rgba(1,1,1,0.1)"
# Set vertex size
visual_style["vertex_size"] = 15
# Set vertex label size
visual_style["vertex_label_size"] = 20
# Set vertex label color
visual_style["vertex_label_color"] = 'red'
# Don't curve the edges
visual_style["edge_curved"] = False
# Set the layout
my_layout = g.layout_fruchterman_reingold()
visual_style["layout"] = my_layout
# Plot the graph
ig.plot(g,'directed_images/communities_leading_eigenvector.png', vertex_label = g.vs['name'] , **visual_style)
# Set the layout
my_layout = g.layout_circle()
visual_style["layout"] = my_layout
# Plot the graph
ig.plot(g,'directed_images/leading_vector_circular.png', vertex_label = g.vs['name'] , **visual_style)
for i in range(len(comm_leading_eigenvector.subgraphs())):
visual_style["bbox"] = (2000,2000)
visual_style["margin"] = 17
# Set vertex colours
visual_style["vertex_color"] = 'green'
# Set edge width
visual_style["edge_width"] = np.log(comm_leading_eigenvector.subgraphs()[i].es['weight']) + 1
# Set the layout
my_layout = comm_leading_eigenvector.subgraphs()[i].layout_fruchterman_reingold()
visual_style["layout"] = my_layout
ig.plot(comm_leading_eigenvector.subgraphs()[i],'directed_images/leading_eigenvector_subgraph' + str(i) + '.png' ,vertex_label = comm_leading_eigenvector.subgraphs()[i].vs['name'],**visual_style )
comm_spinglass = g.community_spinglass(weights = 'weight')
ig.plot(comm_spinglass, mark_groups = True, layout="drl")
modularity = g.modularity(comm_spinglass, weights='weight')
print(modularity)
0.05420660924132347
#get metrics for each community
print('average weighted degree: ', get_avg_weighted_degree(comm_spinglass))
print('average degree: ', get_avg_degree(comm_spinglass))
print('transitivity: ', get_transitivity(comm_spinglass))
print('diameter: ', get_diameter(comm_spinglass))
average weighted degree: [1465.2631578947369, 118.26666666666667, 1055.7105263157894, 230.0, 2607.409090909091, 845.0, 2002.842105263158] average degree: [4.947368421052632, 2.4, 3.4210526315789473, 1.0, 16.272727272727273, 1.0, 5.052631578947368] transitivity: [0.39, 0.1111111111111111, 0.05483967635600839, nan, 0.5967709786725135, nan, 0.24511545293072823] diameter: [3, 3, 3, 1, 3, 1, 4]
df_spinglass = pd.DataFrame({'name': list(g.vs['name']), 'community':comm_spinglass.membership } )
df_spinglass
| name | community | |
|---|---|---|
| 0 | Albania | 0 |
| 1 | Bahamas | 0 |
| 2 | Algeria | 4 |
| 3 | British Virgin Islands | 2 |
| 4 | United Kingdom | 4 |
| ... | ... | ... |
| 191 | Venezuela | 6 |
| 192 | Vietnam | 4 |
| 193 | Yemen | 6 |
| 194 | Zambia | 2 |
| 195 | Zimbabwe | 2 |
196 rows × 2 columns
df_spinglass.describe()
| community | |
|---|---|
| count | 196.000000 |
| mean | 2.994898 |
| std | 1.896008 |
| min | 0.000000 |
| 25% | 2.000000 |
| 50% | 2.000000 |
| 75% | 4.000000 |
| max | 6.000000 |
##plot community
visual_style = {}
vertex_colors = []
for i in range(len(comm_spinglass.membership)):
vertex_colors.append(colors[comm_spinglass.membership[i]])
# Set bbox and margin
visual_style["bbox"] = (5000,5000)
visual_style["margin"] = 17
# Set vertex colours
visual_style["vertex_color"] = vertex_colors
# Set edge width
visual_style["edge_width"] = np.log(g.es['weight']) + 1
# Set edge color
visual_style["edge_color"] = "rgba(1,1,1,0.1)"
# Set vertex size
visual_style["vertex_size"] = 15
# Set vertex label size
visual_style["vertex_label_size"] = 20
# Set vertex label color
visual_style["vertex_label_color"] = 'red'
# Don't curve the edges
visual_style["edge_curved"] = False
# Set the layout
my_layout = g.layout_fruchterman_reingold()
visual_style["layout"] = my_layout
# Plot the graph
ig.plot(g,'directed_images/communities_spinglass.png', vertex_label = g.vs['name'] , **visual_style)
# Set the layout
my_layout = g.layout_circle()
visual_style["layout"] = my_layout
# Plot the graph
ig.plot(g,'directed_images/spinglass_circular.png', vertex_label = g.vs['name'] , **visual_style)
for i in range(len(comm_spinglass.subgraphs())):
visual_style["bbox"] = (2000,2000)
visual_style["margin"] = 17
# Set vertex colours
visual_style["vertex_color"] = 'green'
# Set edge width
visual_style["edge_width"] = np.log(comm_spinglass.subgraphs()[i].es['weight']) + 1
# Set the layout
my_layout = comm_spinglass.subgraphs()[i].layout_fruchterman_reingold()
visual_style["layout"] = my_layout
ig.plot(comm_spinglass.subgraphs()[i],'directed_images/spinglass_subgraph' + str(i) + '.png' ,vertex_label = comm_spinglass.subgraphs()[i].vs['name'],**visual_style )
walktrap = g.community_walktrap(weights = 'weight', steps = 2)
comm_walktrap = walktrap.as_clustering()
ig.plot(comm_walktrap, mark_groups = True, layout="drl")
modularity = g.modularity(comm_walktrap, weights='weight')
print(modularity)
0.002050025384918412
#get metrics for each community
print('average weighted degree: ', get_avg_weighted_degree(comm_walktrap))
print('average degree: ', get_avg_degree(comm_walktrap))
print('transitivity: ', get_transitivity(comm_walktrap))
print('diameter: ', get_diameter(comm_walktrap))
average weighted degree: [0.0, 7984.430656934306, 0.0, 0.0, 143.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] average degree: [0.0, 36.90510948905109, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] transitivity: [nan, 0.44463040899562895, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] diameter: [0, 4, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
df_walktrap = pd.DataFrame({'name': list(g.vs['name']), 'community':comm_walktrap.membership } )
df_walktrap
| name | community | |
|---|---|---|
| 0 | Albania | 0 |
| 1 | Bahamas | 1 |
| 2 | Algeria | 2 |
| 3 | British Virgin Islands | 1 |
| 4 | United Kingdom | 1 |
| ... | ... | ... |
| 191 | Venezuela | 1 |
| 192 | Vietnam | 1 |
| 193 | Yemen | 51 |
| 194 | Zambia | 52 |
| 195 | Zimbabwe | 1 |
196 rows × 2 columns
df_walktrap.describe()
| community | |
|---|---|
| count | 196.000000 |
| mean | 7.867347 |
| std | 13.652566 |
| min | 0.000000 |
| 25% | 1.000000 |
| 50% | 1.000000 |
| 75% | 4.000000 |
| max | 52.000000 |
# ##plot community
# visual_style = {}
# vertex_colors = []
# for i in range(len(comm_walktrap.membership)):
# vertex_colors.append(colors[comm_walktrap.membership[i]])
# # Set bbox and margin
# visual_style["bbox"] = (5000,5000)
# visual_style["margin"] = 17
# # Set vertex colours
# visual_style["vertex_color"] = vertex_colors
# # Set edge width
# visual_style["edge_width"] = np.log(g.es['weight']) + 1
# # Set edge color
# visual_style["edge_color"] = "rgba(1,1,1,0.1)"
# # Set vertex size
# visual_style["vertex_size"] = 15
# # Set vertex label size
# visual_style["vertex_label_size"] = 20
# # Set vertex label color
# visual_style["vertex_label_color"] = 'red'
# # Don't curve the edges
# visual_style["edge_curved"] = False
# # Set the layout
# my_layout = g.layout_fruchterman_reingold()
# visual_style["layout"] = my_layout
# # Plot the graph
# ig.plot(g,'directed_images/communities_walktrap.png', vertex_label = g.vs['name'] , **visual_style)
# # Set the layout
# my_layout = g.layout_circle()
# visual_style["layout"] = my_layout
# # Plot the graph
# ig.plot(g,'directed_images/walktrap_circular.png', vertex_label = g.vs['name'] , **visual_style)
# for i in range(len(comm_walktrap.subgraphs())):
# visual_style["bbox"] = (2000,2000)
# visual_style["margin"] = 17
# # Set vertex colours
# visual_style["vertex_color"] = 'green'
# # Set edge width
# visual_style["edge_width"] = np.log(comm_walktrap.subgraphs()[i].es['weight']) + 1
# # Set the layout
# my_layout = comm_walktrap.subgraphs()[i].layout_fruchterman_reingold()
# visual_style["layout"] = my_layout
# ig.plot(comm_walktrap.subgraphs()[i],'directed_images/walktrap_subgraph' + str(i) + '.png' ,vertex_label = comm_walktrap.subgraphs()[i].vs['name'],**visual_style )
comm_infomap = g.community_infomap(edge_weights = 'weight')
ig.plot(comm_infomap, mark_groups = True, layout="drl")
modularity = g.modularity(comm_infomap, weights='weight')
print(modularity)
0.0
#get metrics for each community
print('average weighted degree: ', get_avg_weighted_degree(comm_infomap))
print('average degree: ', get_avg_degree(comm_infomap))
print('transitivity: ', get_transitivity(comm_infomap))
print('diameter: ', get_diameter(comm_infomap))
average weighted degree: [5647.821428571428] average degree: [28.979591836734695] transitivity: [0.3859593515919117] diameter: [4]
df_infomap = pd.DataFrame({'name': list(g.vs['name']), 'community':comm_infomap.membership } )
df_infomap
| name | community | |
|---|---|---|
| 0 | Albania | 0 |
| 1 | Bahamas | 0 |
| 2 | Algeria | 0 |
| 3 | British Virgin Islands | 0 |
| 4 | United Kingdom | 0 |
| ... | ... | ... |
| 191 | Venezuela | 0 |
| 192 | Vietnam | 0 |
| 193 | Yemen | 0 |
| 194 | Zambia | 0 |
| 195 | Zimbabwe | 0 |
196 rows × 2 columns
## no visualisation since no community is detected